"""
这是student模块的主要操作文件
"""
from 期末项目.Student import Student  # #


class StudentManager(object):
    # 创建一个列表---对应java里面的list集合
    def __init__(self):
        # 用来对数据临时存储
        self.stu_list = []

        # 执行方法

    def run(self):
        print("加载文件夹内部的数据")
        self.load()

        while True:
            # 展示可以选择的功能
            self.xianshi()
            # int(a) 把a转换成int类型
            # input("提示语句") 键盘输入，默认输入的数据类型字符串类型
            xz1 = int(input("请输入你想选择的功能："))
            # pass:表示我目前还不知道写什么
            if xz1 == 1:
                self.stu_add()
            elif xz1 == 2:
                self.stu_del()
            elif xz1 == 3:
                self.stu_up()
            elif xz1 == 4:
                self.stu_seOne()
            elif xz1 == 5:
                self.stu_seAll()
            elif xz1 == 6:
                self.save()
            elif xz1 == 7:
                break

    def xianshi(self):
        print("1,增加学生功能")
        print("2,删除学生功能")
        print("3,修改学生功能")
        print("4,查询一个学生功能")
        print("5,查询全部学生功能")
        print("6,保存文件学生功能")
        print("7,退出系统功能")

    # 增加方法
    def stu_add(self):
        name = input("请输入你的姓名：")
        age = input("请输入你的年龄：")
        gender = input("请输入你的性别：")
        tel = input("请输入你的电话号码：")
        # 把键盘数据保存到对象
        student = Student(name, age, gender, tel)
        # 把对象保存到列表里面去 qppend方法就是把数据加到列表内部
        self.stu_list.append(student)
        print("下面的数据时列表内部的数据")
        # in后面跟的是要循环的列表或集合 循环把列表内部数据赋值给i
        for i in self.stu_list:
            print(i)

    # 删除功能 remove（）删除列表内部数据
    def stu_del(self):
        if len(self.stu_list) == 0:
            print("你列表内部没有数据")
        else:
            name = input("输入要删除的姓名:")
            # 遍历对象
            for i in self.stu_list:
                if i.name == name:  # 有我们想要删除的数据
                    self.stu_list.remove(i)  # 删除数据
                else:
                    print("没有找到！")
            print("操作之后列表内部的数据")
            for i in self.stu_list:
                print(i)

    def stu_up(self):
        if len(self.stu_list) == 0:
            print("你列表内部没有数据")
        else:
            name = input("输入要删除的姓名")
            # 遍历对象
            for i in self.stu_list:
                if i.name == name:  # 有我们想要删除的数据
                    i.name = input("请输入你要修改的名字:")
                    i.age = input("请输入你要修改的年龄:")
                    i.gender = input("请输入你要修改的性别:")
                    i.tel = input("请输入你要修改的电话:")
                    self.stu_list.remove(i)  # 删除数据
                else:
                    print(" 没有找到！")
            print("操作之后列表内部的数据")
            for i in self.stu_list:
                print(i)

    # 查询一个
    def stu_seOne(self):
        if len(self.stu_list) == 0:
            print("你列表内部没有数据")
        else:
            name = input("请输入要查询的名字:")
            for i in self.stu_list:
                if i.name == name:
                    print(i)
                else:
                    print("没有找到！")

    # 查询全部
    def stu_seAll(self):
        # 遍历全部
        for i in self.stu_list:
            print(i)

    def save(self):
        # open表示打开文件 student.data表示文件的路径
        # "w"表示文件内部写入数据 如果没有指定文件，就创建
        # 注意"w"它会把文件内部原来的数据清空写入
        # encoding = "UTF-8"表示防止中文乱码
        f = open("student.data", "w", encoding="UTF-8")
        """
        for i in self.stu_list:遍历列表
        i.__dict__把i对象内部数据转换为字典
        字典：就是java内部的map集合
        """
        new_list = [i.__dict__ for i in self.stu_list]
        # f.write(a) 把数据a写入文件 str(new_list)把数据转换为字符串
        f.write(str(new_list))
        # 关闭文件
        f.close()

    def load(self):
        try:
            f = open("student.data", "r", encoding="UTF-8")
        except:
            f = open("student.data", "w", encoding="UTF-8")
        else: # 如果try没有出现异常就执行else里面的代码
            data = f.read()  # 读取文件的代码
            # 因为文件内部数据是字符串形式所以把字符串转换成字典
            new_list = eval(data)
            print(f"文件内部字典数据为:{new_list}")
            """
            for i in new_list:遍历字典
            i[key值]就能得到对应的value值
            然后把对应的value值作为属性值创建对象
            最后把对象放到列表内部达到取出文件内部数据的方法
            """
            self.stu_list = [Student(i["name"],i["age"],
                                     i["gender"],i["tel"])
                             for i in new_list]